package DataStructureAndAlgorithm.BaseAlgorithm.Sort.MergeSort;
import java.util.*;
//归并排序思想：分治---->以数组的中间来划分
/*
    归并排序基本步骤：
        1.确定分界点：mid = (l + r)/2;
        2.递归排序left和right
        3.归并--->合二为一

    注：归并排序是稳定的
 */
public class mergesort_787 {
    static int[] temp = new int[100010];
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++){
            nums[i] = in.nextInt();
        }
        merge_sort(nums,0,n - 1);
        for (int i = 0; i < n; i++){
            System.out.print(nums[i] + " ");
        }
    }

    static void merge_sort(int[] nums,int left,int right){
        if (left >= right)return;
        int mid = (left + right) / 2;
        merge_sort(nums,left,mid);
        merge_sort(nums,mid + 1,right);
        int k = 0,i = left,j = mid + 1;
        while (i <= mid && j <= right){
            if (nums[i] <= nums[j])temp[k++] = nums[i++];
            else temp[k++] = nums[j++];
        }
        while (i <= mid){
            temp[k++] = nums[i++];
        }
        while (j <= right){
            temp[k++] = nums[j++];
        }
        for (i = left,j = 0; i <= right; i++,j++){
            nums[i] = temp[j];
        }
    }
}
/*
给定你一个长度为 n

的整数数列。

请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。
输入格式

输入共两行，第一行包含整数 n

第二行包含 n
个整数（所有整数均在 1∼109

范围内），表示整个数列。
输出格式

输出共一行，包含 n

个整数，表示排好序的数列。
数据范围

1≤n≤100000

输入样例：

5
3 1 2 4 5

输出样例：

1 2 3 4 5

 */